The AWT attempts to set appropriate default colors for its components, but there is currently no convenient way for a Java program to query and use those colors directly. This is particularly a problem when creating custom components where you'd like to ensure that the background, shadow, and font colors all match the rest of the desktop. In JDK1.1, the AWT will provide a simple API for accessing and using these desktop colors.
A SystemColor object can be used just like any other Color object, the only difference being that the actual value that represents its current color may change dynamically (on systems which support dynamic notification when the user changes the color scheme).
java.awt.SystemColor
SystemColor objects are defined by the system and cannot be instantiated by Java programs.
public final static SystemColor desktop; // Background color of desktop
public final static SystemColor activeCaption; // Background color for captions
public final static SystemColor activeCaptionText; // Text color for captions
public final static SystemColor activeCaptionBorder; // Border color for caption text
public final static SystemColor inactiveCaption; // Background color for inactive captions
public final static SystemColor inactiveCaptionText; // Text color for inactive captions
public final static SystemColor inactiveCaptionBorder; // Border color for inactive captions
public final static SystemColor window; // Background for windows
public final static SystemColor windowBorder; // Color of window border frame
public final static SystemColor windowText; // Text color inside windows
public final static SystemColor menu; // Background for menus
public final static SystemColor menuText; // Text color for menus
public final static SystemColor text; // background color for text
public final static SystemColor textText; // text color for text
public final static SystemColor textHighlight; // background color for highlighted text
public final static SystemColor textHighlightText; // text color for highlighted text
public final static SystemColor control; // Background color for controls
public final static SystemColor controlText; // Text color for controls
public final static SystemColor controlLtHighlight; // Light highlight color for controls
public final static SystemColor controlHighlight; // Highlight color for controls
public final static SystemColor controlShadow; // Shadow color for controls
public final static SystemColor controlDkShadow; // Dark shadow color for controls
public final static SystemColor inactiveControlText; // Text color for inactive controls
public final static SystemColor scrollbar; // Background color for scrollbars
public final static SystemColor info; // Background color for spot-help text
public final static SystemColor infoText; // Text color for spot-help text
If a Java program either sets the foreground or background of a component to be one of these symbolic colors, or uses one of these for rendering, the current value for that symbolic color will be used.
Not all platforms support distinct colors for each of these symbolic names. In the cases where a symbolic color is not supported by a platform, it is mapped to the most appropriate default. These colors are guaranteed to be non-null.
The AWT base components will be modified to use these symbolic colors in order to provide more consistent default integration with the desktop. Java programs written for 1.0 which make any assumptions about the default color of components (i.e. assume they will be "gray") may not render correctly under 1.1. It is always important to query the component for its background/foreground colors within paint() methods for this reason.
import java.awt.*;
//
// Oversimplified separator class for creating 3D horizontal
// line separators
//
public class Separator extends Component {
public Separator(int length, int thickness) {
super();
setSize(length, thickness);
setBackground(SystemColor.control);
}
public void paint(Graphics g) {
int x1, y1, x2, y2;
Rectangle bbox = getBounds();
x1 = 0;
x2 = bbox.width - 1;
y1 = y2 = bbox.height/2 - 1;
g.setColor(SystemColor.controlShadow);
g.drawLine(x1, y2, x2, y2);
g.setColor(SystemColor.controlHighlight);
g.drawLine(x1, y2+1, x2, y2+1);
}
public static void main(String[] args) {
Frame f = new Frame("Separator Example");
f.setSize(200, 100);
f.setBackground(SystemColor.control);
Separator sep = new Separator(200, 4);
f.add("Center", sep);
f.show();
}
}